package com.nas.crocus.controller;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.nas.crocus.domain.Evento;
import com.nas.crocus.domain.Pasajero;
import com.nas.crocus.domain.RegistroPasajero;
import com.nas.crocus.exception.CrocusException;
import com.nas.crocus.exception.EntidadNoUnicaException;
import com.nas.crocus.exception.NotFoundException;
import com.nas.crocus.exception.PrecondicionNoCumplidaException;
import com.nas.crocus.service.PasajeroService;
import com.nas.crocus.service.RegistroPasajeroService;


@Controller
@RequestMapping(value = "/pasajero")
public class PasajeroController {
    
    @Autowired
    private PasajeroService pasajeroService;
    
   

    @RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
    public @ResponseBody Pasajero obtenerPasajero(@PathVariable Long id) throws NotFoundException {
        
        
        Pasajero pasajero = pasajeroService.buscar(id);
        if (pasajero == null) {
            throw new NotFoundException("Pasajero no encontrado");
        }
        
        Evento evento = pasajero.getRegistroPasajero().getEvento();
        
        Evento eventoAEnviar = new Evento();
        eventoAEnviar.setId(evento.getId());
        eventoAEnviar.setNombre(evento.getNombre());
        eventoAEnviar.setCantidadAsistentes(evento.getCantidadAsistentes());
        ArrayList<Pasajero> acompaniantes = new ArrayList<Pasajero>();
        pasajero.setAcompaniantes(acompaniantes);
        pasajero.getRegistroPasajero().setEvento(eventoAEnviar);
        pasajero.getRegistroPasajero().setPasajeros(acompaniantes);
        if (pasajero.getAcompanianteDe() != null) {
            pasajero.getAcompanianteDe().setRegistroPasajero(null);
            pasajero.getAcompanianteDe().setAcompanianteDe(null);
            pasajero.getAcompanianteDe().setAcompaniantes(acompaniantes);
        }
        return pasajero;
    }
    @RequestMapping(method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public @ResponseBody Pasajero crear(@RequestBody Pasajero pasajero) throws EntidadNoUnicaException, PrecondicionNoCumplidaException {
        pasajeroService.guardar(pasajero);
        //TODO volver a buscar el pasajero antes de retornar.
        return pasajero;
    }

    @RequestMapping(method = RequestMethod.PUT)
    public @ResponseBody Pasajero actualizar(@RequestBody Pasajero pasajero) throws EntidadNoUnicaException, PrecondicionNoCumplidaException {
        pasajeroService.actualizar(pasajero);
        return pasajero;
    }
    
    
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NotFoundException.class)
    public @ResponseBody Map<String, String> handleException(NotFoundException ex) {
        Map<String, String> fault = new HashMap<String, String>();
        fault.put("error", ex.getMensaje());
        return fault;
    }
    
    @ResponseStatus(HttpStatus.PRECONDITION_FAILED)
    @ExceptionHandler({EntidadNoUnicaException.class, PrecondicionNoCumplidaException.class})
    public @ResponseBody Map<String, String> handleException(CrocusException ex) {
        Map<String, String> fault = new HashMap<String, String>();
        fault.put("error", ex.getMensaje());
        return fault;

    }
}
